#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 引用 Windows Multimedia API
#pragma comment(lib,"Winmm.lib")

#define High 800  // 游戏画面尺寸
#define Width 590

IMAGE img_bk; // 背景图片
IMAGE img_bk1;//第一关背景
IMAGE img_bk2;//第二关背景

// 大炮位置
float position_x,position_y;
float a,b,c,Angle;
/*float Lposition_x,Lposition_y;
float Mposition_x,Mposition_y;
float Rposition_x,Rposition_y;*/
float direction[500],velocity;
int i,j;
int k = 0;//判断boss射出的子弹命中城墙或炮台的次数
int n = 500;//剩余子弹数
int t = 0;//记录最终boss被击杀次数
int is_failed = 0; // 失败记录
int round = 1; // 关卡数

float hero_x[500],hero_y[500]; // 英雄位置

float enemy_x[6],enemy_y[6]; // 第一关敌人位置

int blood1[3] = {2,2,2}; // 怪物血量

float Enemy_x[6],Enemy_y[6];// 第二关敌人位置

int blood2[5]  ={2,2,2,2,2}; // 怪物血量

float Boss_x,Boss_y; // 终极Boss位置
int blood3=4;//终极Boss血量

float gameover_x,gameover_y; //gameover图片位置

float enemy_vx,enemy_vy; //速度

float bullet_x[2],bullet_y[2];//第一关boss发射出的子弹坐标

float ink_x,ink_y;//第三关终极boss发射的墨汁坐标

float dart_x,dart_y;//终极boss发射的飞镖坐标

 // 第一关大炮图片
IMAGE img_prop1,img_prop2; // 原图
IMAGE img_prop11,img_prop22; // 旋转后输出的图

// 第一关英雄图片
IMAGE img_hero1,img_hero2; 

// 第一关敌人图片
IMAGE img_enemy1,img_enemy2;

// 第二关敌人图片
IMAGE img_enemy2_1,img_enemy2_2;
IMAGE img_enemy3_1,img_enemy3_2;

// 第一关boss图片
IMAGE img_boss1,img_boss2;  

// 第三关boss图片
IMAGE img_boss2_1,img_boss2_2;

// 第一关boss发射的子弹图片
IMAGE img_bullet1,img_bullet2;

// 第三关boss发射的墨汁图片
IMAGE img_ink1,img_ink2;

// 第二关boss发射的飞镖图片
IMAGE img_Bullet3,img_Bullet4;

//游戏结束图片
IMAGE img_gameover; // 失败
IMAGE img_win; // 胜利

// 游戏加载界面图片
IMAGE img_round1,img_round2,img_round3;

int s = 0;

int score = 0; // 得分

int gameStatus = 0; // 游戏状态，0为初始菜单界面，1为正常游戏，2为结束游戏状态，3为游戏暂停，4为游戏加载界面，5为游戏失败，6为游戏胜利

void drawinit1(); // 加载图片
void drawinit2(); // 第二关图片
void drawinit3(); // 第三关图片
// void drawinit4(); // 第三关小怪物图片
void startMenu(); // 初始菜单界面
void pauseMenu(); // 游戏暂停后菜单界面，一般按ESC键后启动该界面
void endgame(); // 游戏失败界面
void win();
void loadgame(); // 游戏加载界面
void startup();  // 数据初始化
void startup1(); // 第一关数据初始化
void startup2(); // 第二关数据初始化
void startup3(); // 第三关数据初始化
//void startup4(); // 第三关出现小怪物数据初始化	
void show();  // 显示画面
void updateWithoutInput();  // 与用户输入无关的更新
void updateWithInput();     // 与用户输入有关的更新
void Judgement(); // 游戏的判定
void gameover();     // 游戏结束、后续处理
void readRecordFile();  //读取游戏数据文件存档
void writeRecordFile();  //存储游戏数据文件存档
void endorretry(); // 游戏结束图片
void lastboss();//显示最终boss
/*void monster();//最后出现的小怪物*/
void lastbossJudge(); // 最终关判定
void time();//时间函数

void transparentimage(int x, int y, IMAGE *srcimg, IMAGE *maskimg) // 透明贴图函数
{
	putimage(x, y, maskimg, SRCAND);
	putimage(x, y, srcimg, SRCPAINT);
}

void time()
{
	SYSTEMTIME ti;
	GetLocalTime(&ti);		// 获取当前时间
	if(ti.wSecond%10==0)
	{
		ink_y=Boss_y+100;
		ink_x=Boss_x-20;
	}
/*	//第三关终极boss
	Boss_x=Width*0.44;
	Boss_y=100;
	
	//终极boss发射的墨汁
	
*/	
	if(ti.wSecond%7==0)
		ink_y = -500;
}


void drawinit1() // 第一关图片
{
	// 载入图片
	loadimage(&img_bk, ".\\background.png");
	loadimage(&img_round1, ".\\tips1.png");
	loadimage(&img_round2, ".\\tips2.png");
	loadimage(&img_round3, ".\\tips3.png");
	loadimage(&img_win, ".\\win.png");

	//第一关
	loadimage(&img_bk1, ".\\background1.png");
	loadimage(&img_prop1, ".\\prop1.png");
	loadimage(&img_prop2, ".\\prop2.png");
	loadimage(&img_hero1, ".\\hero1.png");
	loadimage(&img_hero2, ".\\hero2.png");
	loadimage(&img_enemy1, ".\\enemy1-1.png");
	loadimage(&img_enemy2, ".\\enemy1-2.png");
	loadimage(&img_boss1, ".\\boss1-1.png");
	loadimage(&img_boss2, ".\\boss1-2.png");
	loadimage(&img_bullet1, ".\\bullet1.png");
	loadimage(&img_bullet2, ".\\bullet2.png");
	loadimage(&img_gameover, ".\\gameover.png");
	loadimage(&img_prop1, ".\\prop1.png");
	loadimage(&img_prop1, ".\\prop1.png");
}

void drawinit2()
{
	//第二关
	loadimage(&img_bk2, ".\\background2.png");
	loadimage(&img_prop1, ".\\prop1.png");
	loadimage(&img_prop2, ".\\prop2.png");
	loadimage(&img_hero1, ".\\hero1.png");
	loadimage(&img_hero2, ".\\hero2.png");
	loadimage(&img_enemy2_1, ".\\enemy2-1.png");
	loadimage(&img_enemy2_2, ".\\enemy2-2.png");
	loadimage(&img_enemy3_1, ".\\enemy3-1.png");
	loadimage(&img_enemy3_2, ".\\enemy3-2.png");
	loadimage(&img_boss2_1, ".\\boss2-1.png");
	loadimage(&img_boss2_2, ".\\boss2-2.png");
}
void drawinit3()
{
	//第三关
	loadimage(&img_prop1, ".\\prop1.png");
	loadimage(&img_prop2, ".\\prop2.png");
	loadimage(&img_hero1, ".\\hero1.png");
	loadimage(&img_hero2, ".\\hero2.png");
	loadimage(&img_boss2_1, ".\\boss2-1.png");
	loadimage(&img_boss2_2, ".\\boss2-2.png");
	loadimage(&img_ink1, ".\\ink1.png");
	loadimage(&img_ink2, ".\\ink2.png");
	loadimage(&img_Bullet3, ".\\bullet3.png");
	loadimage(&img_Bullet4, ".\\bullet4.png");

}

/*void drawinit4()
{
	//第三关小怪物
	loadimage(&img_bk2, ".\\background2.png");
	loadimage(&img_prop1, ".\\prop1.png");
	loadimage(&img_prop2, ".\\prop2.png");
	loadimage(&img_hero1, ".\\hero1.png");
	loadimage(&img_hero2, ".\\hero2.png");
	loadimage(&img_boss2_1, ".\\boss2-1.png");
	loadimage(&img_boss2_2, ".\\boss2-2.png");
	loadimage(&img_ink1, ".\\ink1.png");
	loadimage(&img_ink2, ".\\ink2.png");
	loadimage(&img_Bullet3, ".\\bullet3.png");
	loadimage(&img_Bullet4, ".\\bullet4.png");
	loadimage(&img_enemy3_1, ".\\enemy3-1.png");
	loadimage(&img_enemy3_2, ".\\enemy3-2.png");
	
}*/

void startMenu() // 初始菜单界面
{
	putimage(0, 0, &img_bk);	// 显示背景
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(30,0, _T("黑体"));
	outtextxy(Width*0.3, High*0.6, "1 新游戏");
	outtextxy(Width*0.3, High*0.7, "2 读取游戏存档");
	outtextxy(Width*0.3, High*0.8, "3 退出");
	FlushBatchDraw();
	Sleep(2);

	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == '1') 
			gameStatus = 4;
		else if (input == '2')
		{
			readRecordFile();
			gameStatus = 1;
		}
		else if (input == '3')
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void pauseMenu() // 游戏暂停后菜单界面，一般按ESC键后启动该界面
{
	putimage(0, 0, &img_bk);	// 显示背景
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(30,0, _T("黑体"));
	outtextxy(Width*0.3, High*0.4, "1 继续游戏");
	outtextxy(Width*0.3, High*0.5, "2 保存档案");
	outtextxy(Width*0.3, High*0.6, "3 退出");

	settextcolor(BLUE);
	settextstyle(30,0, _T("黑体"));
	outtextxy(Width*0.25, High*0.7, "鼠标按住移动控制弹弓方向");
	outtextxy(Width*0.25, High*0.75, "松开鼠标左键发射");
	outtextxy(Width*0.25, High*0.8, "ESC键暂停游戏");
	FlushBatchDraw();
	Sleep(2);
	
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == '1') 
			gameStatus = 1;
		else if (input == '2')
		{
			writeRecordFile();
			gameStatus = 1;
		}
		else if (input == '3')
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void endgame()
{
	putimage(0, 0, &img_gameover);	// 显示游戏结束图片
	FlushBatchDraw();
	Sleep(2);
	
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == ' ') 
		{
			gameStatus = 1;
			startup();
		}
	}
}

void win()
{
	putimage(0, 0, &img_win);
	FlushBatchDraw();
	Sleep(2);
	
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == ' ') 
		{
			gameStatus = 2;
			exit(0);
		}
	}
}

void loadgame()
{
	switch(round)// 显示游戏加载图片
	{
	case 1:	putimage(0, 0, &img_round1);break;
	case 2:	putimage(0, 0, &img_round2);break;
	case 3:	putimage(0, 0, &img_round3);break;
	}
	FlushBatchDraw();
	Sleep(2);
	
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == ' ') 
		{
			gameStatus = 1;
			startup();
		}
	}
}

void readRecordFile()  //读取游戏数据文件存档
{
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","r");
	fscanf(fp,"%f %f %f %f %f %f %d %d",&hero_x,&hero_y,&enemy_x,&enemy_y,&score);
	fclose(fp);
}

void writeRecordFile()  //存储游戏数据文件存档
{
	FILE *fp;
	fp = fopen(".\\gameRecord.dat","w");
	fprintf(fp,"%f %f %f %f %f %f %d %d",hero_x,hero_y,enemy_x,enemy_y,score);
	fclose(fp);
}

void startup()
{
	if(round == 1)
		startup1();
	if(round == 2)
		startup2();
	if(round == 3)
		startup3();
/*	if (round == 4)
		startup4();*/
}

void startup1()
{
	mciSendString("open .\\menu_music.mp3 alias mumusic", NULL, 0, NULL);//打开背景音乐
	mciSendString("play mumusic repeat", NULL, 0, NULL);  // 循环播放

	initgraph(Width,High);
	// 获取窗口句柄
	HWND hwnd = GetHWnd();
	// 设置窗口标题文字
	SetWindowText(hwnd, "燃烧的蔬菜 v1.0");
	// 载入图片
	drawinit1();
	// 大炮坐标
	position_x=Width*0.50;
	position_y=High*0.85;

	// 第一关敌人坐标
	enemy_x[1]=Width*0.45;
	enemy_y[1]=200;
	
	enemy_x[2]=Width*0.75;
	enemy_y[2]=130;
	
	enemy_x[3]=Width*0.15;
	enemy_y[3]=130;
	
	//第一关boss1坐标
	enemy_x[4]=Width*0.44;
	enemy_y[4]=100;

	//第一关boss2坐标
	enemy_x[5]=Width*0.44;
	enemy_y[5]=20;

	//第一关子弹初始位置
	bullet_x[1]=enemy_x[4]+15;//boss右手中的子弹
	bullet_y[1]=enemy_y[4]+50;

	bullet_x[2]=enemy_x[4]+55;//boss左手中的子弹
	bullet_y[2]=enemy_y[4]+50;

	// 英雄坐标
	/*
	hero_x = -85;
		hero_y = -85;*/
	
	
	
	// 速度及方向
/*	direction = 1;*/
	velocity = 4;
	
	//初速度
	enemy_vx=1;
	enemy_vy=1;
	
	//gameover图片位置
	gameover_x=-100;
	gameover_y=-100;
	
	score = 0; // 分数为0
	k = 0; // 击中次数为0

	BeginBatchDraw();	
	
	while (gameStatus==0)
		startMenu(); // 初始菜单界面
}

void startup2()
{
	mciSendString("open .\\menu_music.mp3 alias mumusic", NULL, 0, NULL);//打开背景音乐
	mciSendString("play mumusic repeat", NULL, 0, NULL);  // 循环播放
	
	initgraph(Width,High);
	// 获取窗口句柄
	HWND hwnd = GetHWnd();
	// 设置窗口标题文字
	SetWindowText(hwnd, "燃烧的蔬菜 v1.0");
	// 载入图片
	drawinit2();
	// 大炮坐标
	position_x=Width*0.50;
	position_y=High*0.85;

	//第二关敌人坐标——小怪物
	Enemy_x[1]=Width*0.45;
	Enemy_y[1]=200;

	Enemy_x[2]=Width*0.75;
	Enemy_y[2]=130;

	Enemy_x[3]=Width*0.15;
	Enemy_y[3]=130;

	//第二关小boss
	Enemy_x[4]=Width*0.44;
	Enemy_y[4]=100;

	// 英雄坐标
	/*
	hero_x = -85;
		hero_y = -85;*/

	// 速度及方向
	/*direction = 1;*/
	velocity = 4;

	//初速度
	enemy_vx=1;
	enemy_vy=1;

	//gameover图片位置
	gameover_x=-100;
	gameover_y=-100;
	
	score = 0; // 分数为0
	k = 0; // 击中数为0

	BeginBatchDraw();	
	
	while (gameStatus==0)
		startMenu(); // 初始菜单界面
}

void startup3()// 终极boss的出现及移动和发射子弹等
{
	mciSendString("open .\\menu_music.mp3 alias mumusic", NULL, 0, NULL);//打开背景音乐
	mciSendString("play mumusic repeat", NULL, 0, NULL);  // 循环播放
	
	initgraph(Width,High);
	// 获取窗口句柄
	HWND hwnd = GetHWnd();
	// 设置窗口标题文字
	SetWindowText(hwnd, "燃烧的蔬菜 v1.0");
	// 载入图片
	drawinit3();
	// 大炮坐标
	position_x=Width*0.50;
	position_y=High*0.85;

	//第三关终极boss
	Boss_x=Width*0.44;
	Boss_y=100;
		
	//终极boss发射的墨汁
	ink_x=Boss_x-20;
	ink_y=200;

	//终极boss发射的飞镖
	dart_x=Width*0.44+15;
	dart_y=200;
}

/*void startup4()// 终极boss的出现附带的小怪物的出现
{	
	mciSendString("open .\\menu_music.mp3 alias mumusic", NULL, 0, NULL);//打开背景音乐
	mciSendString("play mumusic repeat", NULL, 0, NULL);  // 循环播放
	
	initgraph(Width,High);
	// 获取窗口句柄
	HWND hwnd = GetHWnd();
	// 设置窗口标题文字
	SetWindowText(hwnd, "燃烧的蔬菜 v1.0");
	// 载入图片
	drawinit4();
	// 大炮坐标
	position_x=Width*0.50;
	position_y=High*0.85;
	
	//第三关终极boss
	Boss_x=Width*0.44;
	Boss_y=100;
	
	//终极boss发射的墨汁
	ink_x=Boss_x-20;
	ink_y=200;
	
	//终极boss发射的飞镖
	dart_x=Width*0.44+15;
	dart_y=200;

	//第三关小boss1
	Enemy_x[4]=Width*0.15;
	Enemy_y[4]=160;
	
	//第三关小boss2
	Enemy_x[5]=Width*0.75;
	Enemy_y[5]=160;
}*/

void show()
{
	int i;

	while (gameStatus==3)
		pauseMenu(); // 游戏暂停后菜单界面，一般按ESC键后启动该界面

	while (gameStatus==4)
		loadgame(); // 游戏加载界面

	while (gameStatus==5) // 游戏失败界面
		endgame();

	while (gameStatus==6) // 游戏胜利界面
		win();

	if(round == 1) // 判断是否为第一关
	{
		putimage(0, 0, &img_bk1);	// 显示第一关背景*/

	mciSendString("close mumusic", NULL, 0, NULL); // 关闭菜单音乐
	mciSendString("open .\\game_music.mp3 alias bkmusic", NULL, 0, NULL); //打开游戏音乐
	mciSendString("play bkmusic repeat", NULL, 0, NULL);  // 循环播放

	transparentimage(position_x-52,position_y,&img_prop11,&img_prop22); // 炮台

	for(i=1;i<=3;i++)
	transparentimage(enemy_x[i],enemy_y[i], &img_enemy1, &img_enemy2);//第一关敌人

	transparentimage(enemy_x[4],enemy_y[4],&img_boss1,&img_boss2); // 第一关boss
	transparentimage(enemy_x[5],enemy_y[5],&img_boss1,&img_boss2); // 第一关boss

	for (i=1;i<=2;i++)
	{
		transparentimage(bullet_x[i],bullet_y[i],&img_bullet1,&img_bullet2);//第一关子弹
	}
	}
	if (round == 2) // 第二关
	{
		putimage(0, 0, &img_bk2);	// 显示第二关背景

		mciSendString("close mumusic", NULL, 0, NULL); // 关闭菜单音乐
		mciSendString("open .\\game_music.mp3 alias bkmusic", NULL, 0, NULL); //打开游戏音乐
		mciSendString("play bkmusic repeat", NULL, 0, NULL);  // 循环播放
		
		transparentimage(position_x-52,position_y,&img_prop11,&img_prop22); // 炮台

	

		for(i=1;i<=3;i++)
		transparentimage(Enemy_x[i],Enemy_y[i], &img_enemy2_1, &img_enemy2_2);//第二关敌人——小怪物

		transparentimage(Enemy_x[4],Enemy_y[4],&img_enemy3_1,&img_enemy3_2); // 第二关小boss
	}
	if(round == 3) // 第三关
	{
		putimage(0, 0, &img_bk2);	// 显示第三关背景

		mciSendString("close mumusic", NULL, 0, NULL); // 关闭菜单音乐
		mciSendString("open .\\game_music.mp3 alias bkmusic", NULL, 0, NULL); //打开游戏音乐
		mciSendString("play bkmusic repeat", NULL, 0, NULL);  // 循环播放
		
		transparentimage(position_x-52,position_y,&img_prop11,&img_prop22); // 炮台

		transparentimage(Boss_x,Boss_y,&img_boss2_1,&img_boss2_2); // 第三关终极boss

		transparentimage(ink_x,ink_y,&img_ink1,&img_ink2); // 墨汁

		transparentimage(dart_x,dart_y,&img_Bullet3,&img_Bullet4); // 飞镖

	/*	transparentimage(Enemy_x[4],Enemy_y[4],&img_enemy3_1,&img_enemy3_2); // 第三关小boss1

		transparentimage(Enemy_x[5],Enemy_y[5],&img_enemy3_1,&img_enemy3_2); // 第三关小boss2*/
	}
/*	if(round == 4) // 第三关出现小怪物
	{
		putimage(0, 0, &img_bk2);	// 显示第三关背景
		
		mciSendString("close mumusic", NULL, 0, NULL); // 关闭菜单音乐
		mciSendString("open .\\game_music.mp3 alias bkmusic", NULL, 0, NULL); //打开游戏音乐
		mciSendString("play bkmusic repeat", NULL, 0, NULL);  // 循环播放
		
		transparentimage(position_x-52,position_y,&img_prop11,&img_prop22); // 炮台
		
		transparentimage(Boss_x,Boss_y,&img_boss2_1,&img_boss2_2); // 第三关终极boss
		
		transparentimage(ink_x,ink_y,&img_ink1,&img_ink2); // 墨汁
		
		transparentimage(dart_x,dart_y,&img_Bullet3,&img_Bullet4); // 飞镖
		
		transparentimage(Enemy_x[4],Enemy_y[4],&img_enemy3_1,&img_enemy3_2); // 第三关小boss1
		
		transparentimage(Enemy_x[5],Enemy_y[5],&img_enemy3_1,&img_enemy3_2); // 第三关小boss2
	}*/
		settextcolor(RED); // 打印得分
		settextstyle(20,0, _T("黑体"));

		outtextxy(Width*0.7, High*0.85, "被击中次数：");
		char x[5];
		sprintf(x, "%d", k);
		outtextxy(Width*0.9, High*0.85, x);

		outtextxy(Width*0.7, High*0.9, "剩余子弹数：");
		char y[5];
		sprintf(y, "%d", n);
		outtextxy(Width*0.9, High*0.9, y);

		outtextxy(Width*0.7, High*0.95, "得分：");
		char s[5];
		sprintf(s, "%d", score);
		outtextxy(Width*0.9, High*0.95, s);

		Sleep(2);
}
void updateWithInput()
{
	float stence1;
	float stence2;
	float rate;
	float xie;
	char input;
	if(kbhit())  // 判断是否有输入
	{
		input = getch();  // 根据用户的不同输入来移动，不必输入回车
		if (input == 27) // ESC键的ACSII码为27
		{
			gameStatus = 3;
		}
	}
	MOUSEMSG m;
	while(MouseHit())
	{
		m = GetMouseMsg();
		a=m.x-position_x;
		b=m.y-position_y-60;
		c=a/b;
		Angle = atan(c);
		if(round == 1)
		{
			rotateimage(&img_prop11,&img_prop1,Angle,RGB(255,189,99));  // 同时旋转图片
			rotateimage(&img_prop22,&img_prop2,Angle,RGB(255,189,99));
		}
		else
		{
			rotateimage(&img_prop11,&img_prop1,Angle,RGB(12,108,159));  // 同时旋转图片
			rotateimage(&img_prop22,&img_prop2,Angle,RGB(12,108,159));
		}
		if(m.uMsg == WM_LBUTTONDOWN)
			{

				n--;
				stence1=m.x-Width*0.5;  //鼠标点击位置x轴的变量
				stence2=High*0.85+60-m.y;  //鼠标点击位置y轴的变量
				
				xie=sqrt(stence1*stence1+stence2*stence2);//斜边的长
				
				rate=stence1/stence2;   //x轴的变量 比上 y轴的变量  
				
				direction[s]=1.0*rate*10;       //计算横向速度
				
				// 按下鼠标左键，发射
				if(stence1!=0)
				{
					hero_x[s] = position_x-34+60*stence1/xie;
					hero_y[s] = position_y-34+60-60*stence2/xie;
				}
				else
				{
					hero_x[s] = position_x-34;
					hero_y[s] = position_y-34;
				}										//英雄在炮口射出
				
				s++;
			}
		
	}	
}
void updateWithoutInput()
{	
		

	for(i=0;i<500;i++)	
	{
		transparentimage(hero_x[i],hero_y[i],&img_hero1,&img_hero2); 
		// 英雄
		if(hero_x[i]>-100 && hero_y[i]>-100)
		{
			hero_x[i]+=direction[i]+0;     //英雄横向移动
			hero_y[i]-=10;				//英雄纵向移动
		}
		            
	}
	
	if(round == 1)
	{
		//第一关有关的怪物及子弹移动
	if(enemy_y[1]<600)
	{
		enemy_y[1]+=1.3;
		
			enemy_y[2]++;

			enemy_y[3]++;
			if (enemy_x[2]>=350)
			{
				enemy_x[2]--;
			}
			if (enemy_x[3]<=200)
			{
				enemy_x[3]++;
			}
			
	}
	//抵达城墙后重新生成怪物并扣分
	for (i=1;i<=5;i++)
	{
		if (enemy_y[i]>=600)
		{
			score--;

			enemy_y[i]=rand()%High;
			enemy_x[i]=rand()%Width;
			
		}
	}
	
    //第一关子弹射出
	for (i=1;i<=2;i++)
	{
		bullet_y[i]++;
		if(bullet_y[i]>=210 && bullet_y[i]<=High*0.85-20)
		{
					bullet_y[i]+=1.1;
		}
		else if (bullet_y[i]>=High*0.85-20)
		{
			k++;//子弹击中后被击中数加一
	
			bullet_x[1]=enemy_x[4]+15;//第一关boss右手中的子弹
			bullet_y[1]=enemy_y[4]+50;
			
			bullet_x[2]=enemy_x[4]+55;//第一关boss左手中的子弹
			bullet_y[2]=enemy_y[4]+50;
			
		}
	}
	
	//第一关boss移动
	if (enemy_y[4]<=600)
	{
		enemy_y[4]++;
	}
	
	if (enemy_y[5]<=600)
	{
		enemy_x[5]=enemy_x[5]+enemy_vx;
		enemy_y[5]=enemy_y[5]+enemy_vy;
		
		if ((enemy_x[5]<=Width)||(enemy_x[5]>=0))
		{
			enemy_vx=-1*enemy_vx;
		}
		
	}
	if (k > 7 || n <0 )//第一关当boss1发射的子弹击中城墙或者炮台8次后gameover
		is_failed = 1;
	}
	
	if(round == 2) // 第二关
	{
		//第二关有关的怪物及子弹的移动
	if(Enemy_y[1]<600)
	{
		Enemy_y[1]+=1.3;
		
		Enemy_y[2]++;
		
		Enemy_y[3]++;
		if (Enemy_x[2]>=350)
		{
			Enemy_x[2]--;
		}
		if (Enemy_x[3]<=200)
		{
			Enemy_x[3]++;
		}
		
	}
	//抵达城墙后重新生成怪物并扣分
	for (i=1;i<=4;i++)
	{
		if (Enemy_y[i]>=600)
		{
			score--;
			
			Enemy_y[i]=rand()%High-350;
			Enemy_x[i]=rand()%Width;
			
		}
	}
	
	//第二关小boss移动
	if (Enemy_y[4]<=600)
	{
		Enemy_y[4]++;
	}

	}

	if (score < 0)// 得分为负数时gameover
		is_failed = 1;

	Sleep(10);
}

void lastboss()
{
	
	if(round == 3)
	{
		//飞镖移动
		dart_y+=1.2;
		
		if(dart_y>=620)
		{
			k++;//飞镖击中炮台或者城墙后被击中数加一

			dart_x=Boss_x+15;
			dart_y=Boss_y+100;
		}
	}
	if (score < 0)// 得分为负数时gameover
		is_failed = 1;

}

void gameover()
{
	EndBatchDraw();
	getch();
	closegraph();
}


void Judgement()   //判断击中敌人
{
	int i,j;
	if(round == 1)//第一关
	{
		for(j=1;j<=5;j++)
		{
			for(i=0;i<500;i++)
			{
				if(abs(hero_x[i]-enemy_x[j])<=55 && abs(hero_y[i]-enemy_y[j])<=55 && j<=3)
				{
					score++;
					mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
					mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
					mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
					mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
					enemy_x[j] = rand()%(Width-68);//生成新敌人
					enemy_y[j] = 0;
					hero_x[i]=-100;
					hero_y[i]=-100;
				}
				else if(abs(hero_x[i]-enemy_x[j])<=55 && abs(hero_y[i]-enemy_y[j])<=55 && j>3)
				{
					hero_x[i]=-100;
					hero_y[i]=-100;
					mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
					mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
					mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
					mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
					blood1[j-4]=blood1[j-4]-1;
					if(blood1[j-4]==0)
					{
						score++;
						
						enemy_x[j] = rand()%(Width-68);//生成新敌人
						enemy_y[j] = 0;
						blood1[j-4]=2;
						
					}
				}
				if(enemy_y[j] == 590)//判断是否抵达城墙
				{
					score--;  //分数减少
					
					enemy_x[j] = rand()%Width-68;//生成新敌人
					enemy_y[j] = 0;
				}
			}
			
			
		}
	}
	
		if(round == 2)//第二关
	{
		for(j=1;j<=4;j++)
		{
			for(i=0;i<500;i++)
			{
				if(abs(hero_x[i]-Enemy_x[j])<=55 && abs(hero_y[i]-Enemy_y[j])<=55 && j<=4)
				{
					blood2[j-1]=blood2[j-1]-1;
					hero_x[i]=-100;
					hero_y[i]=-100;
					mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
					mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
					mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
					mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
					if(blood2[j-1]==0)
					{
						score++;
						mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
						mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
						mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
						mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
						Enemy_x[j] = rand()%(Width-68);//生成新敌人
						Enemy_y[j] = 0;
						
						blood2[j-1]=2;
					}
				}
			
				if(enemy_y[j] == 590)//判断是否抵达城墙
				{
					score--;  //分数减少
					
					Enemy_x[j] = rand()%Width-68;//生成新敌人
					Enemy_y[j] = 0;
				}
			}
			
			
		}
	}


/*
	if (score > 5)// 得分大于5进入第二关
	{
		is_failed = 0;
		round = 2; 
	}
*/

	if (score < 0)// 得分为负数时gameover
		is_failed = 1;
}

void lastbossJudge()
{	
	
	if(round == 3)//第三关
	{
	
		
		for(i=0;i<500;i++)
		{
			if(abs(hero_x[i]-Boss_x)<=55 && abs(hero_y[i]-Boss_y)<=55)//第三关判断是否击中终极boss
			{
				blood3--;
				
				mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
				mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
				mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
				mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
				
				hero_x[i]=-100;
				hero_y[i]=-100;
				if(blood3 == 0)
				{
					score++;
					t++;//终极boss被击杀次数加一
					mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
					mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
					mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
					mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
					Boss_x = rand()%(Width-68)-30;//生成新boss
					Boss_y = 0;
					hero_x[i] = -100;
					hero_y[i] = -100;
					blood3 = 4;
				}
			}
			
				if(abs(hero_x[i]-ink_x)<=65 && abs(hero_y[i]-ink_y)<=65)//第三关判断是否击中墨汁
			{
			score++;
			mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
			mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
			mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
			mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
			hero_x[i]=-100;
			hero_y[i]=-100;
			
			  ink_y=Boss_x-20;
			  ink_y=Boss_y+100;
			  }
			
			/*if(abs(hero_x[i]-dart_x)<=55 && abs(hero_y[i]-dart_y)<=55)//第三关判断是否击中飞镖
			{
			
			  mciSendString("stop gemusic", NULL, 0, NULL);   // 先把前面一次的音乐停止
			  mciSendString("close gemusic", NULL, 0, NULL); // 先把前面一次的音乐关闭
			  mciSendString("open .\\hitEnemy.mp3 alias gemusic", NULL, 0, NULL); // 打开跳动音乐
			  mciSendString("play gemusic", NULL, 0, NULL); // 仅播放一次
			  hero_x[i]=-100;
			  hero_y[i]=-100;
			  
				dart_x=Boss_x-20;
				dart_y=Boss_y+100;
			}
			*/
		}
		
	}

	time();//调用时间函数使墨汁每10秒消失/出现
}

int main()
{
	char input;
	int op = 1;
	startup();  // 数据初始化	
	do // 重新启动程序
	{
		while (1)  //  游戏循环执行
		{
			show();  // 显示画面
			updateWithoutInput();  // 与用户输入无关的更新
			lastboss();
			/*monster();*/
			FlushBatchDraw(); // 开始绘图
			updateWithInput();     // 与用户输入有关的更新
			Judgement(); // 游戏判定及后续
			lastbossJudge();
			if(is_failed == 1)
			{
				gameStatus = 5;
				is_failed = 0;
			}
			
			if (is_failed == 0)
			{
				if(score > 5 && round == 1)
				{
					op = 1;
					round = 2;
					gameStatus = 4;
					startup();
				}
				if(score > 5 && round == 2)
				{
					op = 1;
					round = 3;
					gameStatus = 4;
					startup();
				}
				if(t==2 && round == 3)
				{
					op = 1;
					gameStatus = 6;
					//startup();
				}
			
			}
		}
	}while(op == 1); // 结束游戏
	gameover();     // 游戏结束、后续处理
	return 0;
}